package time;

import time.domain.TimeSlice;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Random;

public class TimeSliceGenerator {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static List<TimeSlice> generateTimeSlices(Date startTime, Date endTime, int sliceCount) throws ParseException {
        // 检查参数的有效性
        if (startTime == null || endTime == null || sliceCount <= 0) {
            throw new IllegalArgumentException("无效的输入参数");
        }

        // 计算总的时间间隔（毫秒）
        BigDecimal totalMillis = new BigDecimal(endTime.getTime() - startTime.getTime());
        if (totalMillis.compareTo(new BigDecimal(0.75 * sliceCount)) < 0) {  // 确保每个时间片至少有合理的长度
            throw new IllegalArgumentException("时间片数量对于给定的时间间隔来说太大");
        }

        // 创建一个随机数生成器
        Random random = new Random();

        // 初始化一个列表来保存时间段
        List<TimeSlice> timeSlices = new ArrayList<>();

        // 计算平均时间片长度（毫秒）
        BigDecimal averageSliceMillis = totalMillis.divide(new BigDecimal(sliceCount), BigDecimal.ROUND_HALF_UP);

        // 定义时间片长度的标准差
        BigDecimal stdDeviation = averageSliceMillis.multiply(new BigDecimal(0.1)); // 标准差为平均长度的10%

        // 生成 sliceCount-1 个时间段
        BigDecimal currentMillis = new BigDecimal(startTime.getTime());
        for (int i = 0; i < sliceCount - 1; i++) {
            // 计算当前时间片的长度
            double gaussianValue = random.nextGaussian() * stdDeviation.doubleValue();
            BigDecimal sliceLength = averageSliceMillis.add(new BigDecimal(gaussianValue)).setScale(0, BigDecimal.ROUND_HALF_UP);

            // 确保时间片长度非负
            if (sliceLength.compareTo(BigDecimal.ZERO) < 0) {
                sliceLength = BigDecimal.ZERO;
            }

            // 创建当前时间段
            Date sliceStart = new Date(currentMillis.longValue());
            currentMillis = currentMillis.add(sliceLength);
            Date sliceEnd = new Date(currentMillis.longValue());

            // 将时间段添加到列表中
            TimeSlice timeSlice = new TimeSlice(sliceStart, sliceEnd);
            timeSlices.add(timeSlice);
        }

        // 添加最后一个时间段，确保结束时间是原始的结束时间
        Date lastSliceStart = new Date(currentMillis.longValue());
        TimeSlice lastTimeSlice = new TimeSlice(lastSliceStart, endTime);
        timeSlices.add(lastTimeSlice);

        return timeSlices;
    }

    public static void main(String[] args) throws ParseException {
        // 示例调用
        Date start = dateFormat.parse("2024-11-07 15:20:00");
        Date end = dateFormat.parse("2024-11-07 16:20:00"); // 结束时间为两年后
        int numberOfSlices = 10; // 分割成10个时间片

        List<TimeSlice> timeSlices = generateTimeSlices(start, end, numberOfSlices);
        for (TimeSlice timeSlice : timeSlices) {
            System.out.println(dateFormat.format(timeSlice.getStartTime()) + " - " + dateFormat.format(timeSlice.getEndTime()));
        }
    }
}